package com.demo.sender.notice.lark.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

/**
 * lark 签名校验 设定后，发送的请求是需要签名验证来保障来源可信。 签名的算法：把 timestamp + "\n" + 密钥 当做签名字符串，使用 HmacSHA256 算法计算签名，再进行 Base64 编码。
 * <a href="https://open.larksuite.com/document/client-docs/bot-v3/add-custom-bot">https://open.larksuite.com/document/client-docs/bot-v3/add-custom-bot</a>
 *
 * @author wangfengchen
 */
@Slf4j
public class LarkSignUtil {

  /**
   * 签名校验
   *
   * @param secret
   * @param timestamp 时间戳（秒数） 距当前时间不超过 1 小时(3600)的时间戳，时间单位s，如：1599360473
   * @return
   */
  public static String genSign(String secret, int timestamp) {
    if (StringUtils.isBlank(secret)) {
      return null;
    }
    //把timestamp+"\n"+密钥当做签名字符串
    String stringToSign = timestamp + "\n" + secret;
    //使用HmacSHA256算法计算签名
    Mac mac = null;
    try {
      mac = Mac.getInstance("HmacSHA256");
      mac.init(new SecretKeySpec(stringToSign.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
    } catch (NoSuchAlgorithmException | InvalidKeyException e) {
      log.error("生成签名异常，e = {}", ExceptionUtils.getStackTrace(e));
      throw new RuntimeException(e);
    }
    byte[] signData = mac.doFinal(new byte[]{});
    return new String(Base64.encodeBase64(signData));
  }

}
